package tempest.interfaces.logininterface;

import tempest.clients.PlayerClient;
import tempest.data.Data;
import tempest.interfaces.MudInterface;
import tempest.interfaces.gameinterface.GameInterface;
import tempest.primitives.MudString;
import tempest.server.Mud;
import tempest.server.PlayerList;

public class LoginInterface extends MudInterface

{
  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  private boolean nullCommand;

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public LoginInterface(PlayerClient client)

  {
    super(client);
    nullCommand = false;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void handleInput()

  {
    if (commandQueue.size() == 0) return;
    MudString command = new MudString(commandQueue.removeFirst());

    if (command.length() == 0) {
      nullCommand = true;
      return; }

    command = command.toLowerCase();

    if (PlayerList.isInGame(command)) {
      client.reconnect((PlayerClient) PlayerList.find(command));
      return; }

    Data entity = Mud.get("characters").get(command);

    if (entity == null) {
      outputQueue.add("#nInvalid character.#N");
      return; }

    entity.parent().remove(entity);
    client.setEntityData(entity);

    MudInterface newInterface = new GameInterface(client);
    client.pushInterface(newInterface);
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void handleOutput()

  {
    if (nullCommand)

    {
      client.msg(getPrompt());
      nullCommand = false;
      return;
    }

    if (outputQueue.size() == 0) return;

    MudString output = new MudString();

    for (int i=0; i<outputQueue.size(); i++)
      output.append(outputQueue.get(i));

    output.append("\r\n");
    output.append(getPrompt());
    client.msg(output);
    outputQueue.clear();
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void receiveCommand(String commandString) throws Exception

  {
    commandString = commandString.trim();

    if (commandString.length() > 0)
      commandQueue.add(commandString);
    else nullCommand = true;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void echo(String s)

  {
    outputQueue.add(s);
  }

  public void echo(MudString s)

  {
    outputQueue.add(s.toString());
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onDisconnect()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onReconnect()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onPush()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onPop()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public MudString getPrompt()

  {
    return new MudString(" Enter Account Username: ");
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void focusGained()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void exit()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////
}